using System;

namespace CoreManager.Core.Caching
{
    /// <summary>
    /// 缓存常量配置类
    /// 统一管理系统中所有缓存相关的常量参数
    /// </summary>
    public static class CacheConstants
    {
        #region 缓存键前缀常量
        
        /// <summary>
        /// 用户令牌缓存键前缀
        /// 用于存储用户登录后的访问令牌
        /// </summary>
        public const string USER_TOKEN_PREFIX = "USER_TOKEN_";
        
        /// <summary>
        /// 验证码缓存键前缀
        /// 用于存储图形验证码
        /// </summary>
        public const string CAPTCHA_PREFIX = "CAPTCHA_";

        /// <summary>
        /// 用户刷新令牌缓存键前缀
        /// 用于存储用户登录后的访问令牌
        /// </summary>
        public const string USER_REFRESH_TOKEN = "USER_REFRESH_TOKEN_";

        /// <summary>
        /// 用户会话缓存键前缀
        /// 用于存储用户会话信息
        /// </summary>
        public const string USER_SESSION_PREFIX = "USER_SESSION_";
        
        /// <summary>
        /// 权限缓存键前缀
        /// 用于存储用户权限信息
        /// </summary>
        public const string USER_PERMISSION_PREFIX = "USER_PERMISSION_";
        
        #endregion

        #region 缓存过期时间常量
        
        /// <summary>
        /// 用户令牌缓存过期时间（7天）
        /// 与JWT令牌的有效期保持一致
        /// </summary>
        public static readonly TimeSpan USER_TOKEN_EXPIRY = TimeSpan.FromDays(7);

        /// <summary>
        /// RefreshToken过期时间（7天）
        /// </summary>
        public  static readonly TimeSpan REFRESH_TOKEN_EXPIRY = TimeSpan.FromDays(7);

        /// <summary>
        /// 验证码缓存过期时间（5分钟）
        /// 验证码的有效期，过期后需要重新获取
        /// </summary>
        public static readonly TimeSpan CAPTCHA_EXPIRY = TimeSpan.FromMinutes(5);
        
        /// <summary>
        /// 用户会话缓存过期时间（30分钟）
        /// 用户无操作30分钟后会话过期
        /// </summary>
        public static readonly TimeSpan USER_SESSION_EXPIRY = TimeSpan.FromMinutes(30);
        
        /// <summary>
        /// 权限缓存过期时间（1小时）
        /// 用户权限信息缓存1小时，减少数据库查询
        /// </summary>
        public static readonly TimeSpan USER_PERMISSION_EXPIRY = TimeSpan.FromHours(1);
        
        /// <summary>
        /// 短期缓存过期时间（10分钟）
        /// 用于一些临时性的缓存数据
        /// </summary>
        public static readonly TimeSpan SHORT_TERM_EXPIRY = TimeSpan.FromMinutes(10);
        
        /// <summary>
        /// 长期缓存过期时间（24小时）
        /// 用于一些相对稳定的配置数据
        /// </summary>
        public static readonly TimeSpan LONG_TERM_EXPIRY = TimeSpan.FromHours(24);

        #endregion

        #region 缓存键生成辅助方法

        /// <summary>
        /// 生成用户令牌缓存键
        /// </summary>
        /// <param name="userId">用户ID</param>
        /// <returns>完整的缓存键</returns>
        public static string GetUserTokenKey(int userId)
        {
            return $"{USER_TOKEN_PREFIX}{userId}";
        }
        
        /// <summary>
        /// 生成验证码缓存键
        /// </summary>
        /// <param name="requestId">请求ID</param>
        /// <returns>完整的缓存键</returns>
        public static string GetCaptchaKey(string requestId)
        {
            return $"{CAPTCHA_PREFIX}{requestId}";
        }
        
        /// <summary>
        /// 生成用户会话缓存键
        /// </summary>
        /// <param name="sessionId">会话ID</param>
        /// <returns>完整的缓存键</returns>
        public static string GetUserSessionKey(string sessionId)
        {
            return $"{USER_SESSION_PREFIX}{sessionId}";
        }
        
        /// <summary>
        /// 生成用户权限缓存键
        /// </summary>
        /// <param name="userId">用户ID</param>
        /// <returns>完整的缓存键</returns>
        public static string GetUserPermissionKey(int userId)
        {
            return $"{USER_PERMISSION_PREFIX}{userId}";
        }
        
        #endregion
    }
}